package studentinformationmanagementsystem.service.impl;

import studentinformationmanagementsystem.dao.StudentDao;
import studentinformationmanagementsystem.dao.impl.StudentDaoImpl;
import studentinformationmanagementsystem.entity.Page;
import studentinformationmanagementsystem.entity.Student;
import studentinformationmanagementsystem.service.StudentService;
import studentinformationmanagementsystem.utils.GetMD5;
import studentinformationmanagementsystem.utils.IDUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 苗庆
 * @version 1.0
 */
public class StudenServiceImpl implements StudentService {

           StudentDao studentDao=new StudentDaoImpl();

    /**
     * 登陆
     *
     * @param student
     * @return
     */
    @Override
    public Student login(Student student) {

        return studentDao.queryByUsernameAndPassword(student);
        
    }

    /**
     * 检查学号是否已存在
     *
     * @param student
     * @return true 学号已存在
     */
    @Override
    public boolean isExistsUsername(Student student) {
        boolean falg=false;

        Student student1 = studentDao.queryByUsername(student);

        if (student1!=null){
            falg=true;
        }

        return falg;
    }


    /**
     * 分页查询
     * @param pageNo  查询页码
     * @param pageSize  每页的记录数
     * @return
     */
    @Override
    public Page<Student> page(int pageNo, int pageSize) {
        /**
         * 当前页码:pageNo
         * 总页码:pageTotal
         * 当前页显示的数量:pageSize
         * 总记录数:pageTotalCount
         * 当前页数据:items
         */

        //访问页面的记录条数的开始行数：当前页码-1*每页展示的记录行数
        int bigin=(pageNo-1)*pageSize;


        //总记录数量
        Integer pageTotalCount=studentDao.queryForPageTotalCount();

        //总页码数量=总记录数/每页记录显示数量，然后判断是否可以被除尽，如果不能除尽，那么总的页码数量就需要+1
        Integer pageTotal=pageTotalCount/pageSize;

        if (pageTotalCount%pageSize!=0){
            pageTotal++;
        }


        //当前页码数据
        List<Student> items = studentDao.queryForPageItems(bigin, pageSize);

        Page<Student> objectPage = new Page<Student>(pageNo,pageTotal,pageSize,pageTotalCount,items);

        return objectPage;
    }


    /**
     * 添加学生信息用户
     *
     * @param student
     */
    @Override
    public int register(Student student) {
        return studentDao.insert(student);
    }

    /**
     *  根据ID更新学生信息
     * @param student  学生对象
     * @return 受影响的记录行数
     */
    @Override
    public int update(Student student) {
        return studentDao.update(student);
    }


    /**
     *  根据ID删除学生
     * @param student 学生ID
     * @return 受影响的记录行数
     */
    @Override
    public int delete(Student student) {
        return studentDao.delete(student);
    }


    /**
     * 查询所有学生信息
     * @return 所有学生信息
     */
    @Override
    public List<Student> queryAll() {
        return studentDao.queryAll();
    }

    /**
     * 根据学生ID查询学生信息
     * @param student 学生ID
     * @return 学生信息
     */
    @Override
    public Student queryById(Student student) {
        return studentDao.queryById(student);
    }



    /**
     * 学生修改自己的账号密码
     * @param student   学生对象
     * @param formerpassword  旧密码
     * @param newpassword   新密码
     * @param confirmpassword  确认的新密码
     * @return map
     *
     * 业务逻辑：
     * 1.判断当前输入的旧密码是否和学生数据库存储的密码一致
     * 2.再次判断新密码和确认新密码是否一致
     * 3.上面两条都满足就将新密码替换旧密码
     * 4。调用修改学生信息的方法
     * 5.返回判断信息
     */
    @Override
    public Map<String, String> changePassword(Student student, String formerpassword, String newpassword, String confirmpassword) {


        //定义个map用来装返回给上一级的判断信息
        Map<String,String> map=new HashMap<>();

        //1.判断当前输入的旧密码是否和学生数据库存储的密码一致

        //将输入进来的密码进行加密
        String s = GetMD5.string2MD5(formerpassword);
        String password = student.getPassword();

        if (!s.equals(password)){
            map.put("code","0");   //"输入的旧密码不正确"
            return map;
        }

        //2.判断新密码和确认新密码是否一致
        String s1 = GetMD5.string2MD5(newpassword);
        String s2 = GetMD5.string2MD5(confirmpassword);
        if (!s1.equals(s2)){
            map.put("code","1");   //"新密码两次输入的不一致"
            return map;
        }

        //3.上面两条都满足就将新密码替换旧密码
        student.setPassword(s2);

        //4.调用修改学生信息的方法
        int update = update(student);
        //判断密码是否修改成功
        if (update>=1){
            map.put("code","2");   //"修改密码成功"
            return map;
        }else { //修改密码失败
            map.put("code","3");   //修改密码失败
            return map;
        }
    }


    /**
     *
     * @param student  包括学生的学号、身份证号、手机号
     * @return
     * 业务逻辑思路：
     * 1.对身份证格式再一次进行验证
     * 2.在身份证格式正确的情况下进行调用数据库查询，查询是否可以找到这个学生对象。
     * 3.如果可以找到这个学生，那么就修改这个学生的密码为123456
     * 4.返回成功信息。
     */
    @Override
    public Map<String, String> resetPassword(Student student) {
        //定义个map用来装返回给上一级的判断信息
        Map<String,String> map=new HashMap<>();


        //1.对身份证格式再一次进行验证
        boolean idNumber = IDUtils.isIDNumber(student.getIdnumber());

        if (idNumber==false){
            map.put("code","0");   //"输入的身份证格式有误请检查后重新输入"
            return map;
        }

        //2.在身份证格式正确的情况下进行调用数据库查询，查询是否可以找到这个学生对象。
        Student student1 = studentDao.queryByStudentidAndIdnumberAndPhone(student);

        if (student1==null){

            map.put("code","1");   //"未找到该学生对象，即学号、手机号、身份证号有误"
            return map;

        }

        //3.如果可以找到这个学生，那么就修改这个学生的密码为qw123456
        student1.setPassword(GetMD5.string2MD5("qw123456"));
        int update = studentDao.update(student1);

        if (update>=1){

            map.put("code","2");   //"重置密码成功"
            return map;

        }else {

            map.put("code","3");   //重置密码失败
            return map;
        }

    }


}
